/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.awt.print.PrinterException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanArrayDataSource;
import org.apache.log4j.Logger;
import org.primefaces.event.DateSelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.helper.VentaFacturacionPrintHelper;
import pe.com.cotelasa.scp.common.GenericUtil;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.controlador.backingBean.BKComponenteFindAddArticulo;
import pe.com.cotelasa.scp.controlador.backingBean.BKVentaDetalleFacturacion;
import pe.com.cotelasa.scp.controlador.backingBean.BKVentaFacturacion;
import pe.com.cotelasa.scp.controlador.comando.ComandoActualizar;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.dominio.common.COLOR_ESTADO_VENTA;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.ResultadoServicio;
import pe.com.cotelasa.scp.dominio.common.TIPO_DOC_VENTA;
import pe.com.cotelasa.scp.dominio.common.TIPO_FORMA_PAGO;
import pe.com.cotelasa.scp.dominio.common.TIPO_MONEDA;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioCadenas;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioNumeroALetras;
import pe.com.cotelasa.scp.dominio.excepcion.ModelExcepcion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.modelo.KardexModel;
import pe.com.cotelasa.scp.dominio.service.IServicioCorrelativoDocumento;
import pe.com.cotelasa.scp.dominio.service.IServicioIgv;
import pe.com.cotelasa.scp.dominio.service.IServicioKardex;
import pe.com.cotelasa.scp.dominio.service.IServicioParametro;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoCambio;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoDocumento;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoFormaPago;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoMoneda;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaDetalleFacturacion;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaFacturacion;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaLineaCredito;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaLineaCreditoDetalle;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaNotaCredito;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaNotaDebito;
import pe.com.cotelasa.scp.entidad.Cliente;
import pe.com.cotelasa.scp.entidad.CorrelativoDocumento;
import pe.com.cotelasa.scp.entidad.Kardex;
import pe.com.cotelasa.scp.entidad.ParametroDetalle;
import pe.com.cotelasa.scp.entidad.TipoCambio;
import pe.com.cotelasa.scp.entidad.TipoDocumento;
import pe.com.cotelasa.scp.entidad.TipoFormaPago;
import pe.com.cotelasa.scp.entidad.TipoMoneda;
import pe.com.cotelasa.scp.entidad.VentaDetalleFacturacion;
import pe.com.cotelasa.scp.entidad.VentaDetalleFacturacionPK;
import pe.com.cotelasa.scp.entidad.VentaFacturacion;
import pe.com.cotelasa.scp.entidad.VentaLineaCredito;
import pe.com.cotelasa.scp.entidad.VentaLineaCreditoDetalle;
import pe.com.cotelasa.scp.entidad.VentaNotaCredito;
import pe.com.cotelasa.scp.entidad.VentaNotaDebito;
import pe.com.cotelasa.scp.to.RegistroVentas;
import pe.com.cotelasa.scp.to.ReporteVentas;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;
import javax.faces.context.FacesContext;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.util.JRLoader;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import static pe.com.cotelasa.common.controlador.MBGenerico.mostrarError;
import static pe.com.cotelasa.common.controlador.MBGenerico.mostrarWarning;
import pe.com.cotelasa.scp.dominio.service.IServicioParametroDetalle;

/**
 *
 * @author Jorge
 */
@Named(value = "MBVentaFacturacion")
@Scope("request")
public class MBVentaFacturacion extends MBGenerico implements IMantenedor, IObserver, Serializable {

    private static Logger logger = Logger.getLogger(MBVentaFacturacion.class);
    @Inject
    private BKVentaFacturacion bkVentaFacturacion;
    @Inject
    private BKVentaDetalleFacturacion bkVentaDetalleFacturacion;
    @Inject
    private IServicioVentaFacturacion servicioVentaFacturacion;
    @Inject
    private IServicioVentaDetalleFacturacion servicioVentaDetalleFacturacion;
    @Inject
    private IServicioVentaNotaCredito servicioVentaNotaCredito;
    @Inject
    private IServicioVentaNotaDebito servicioVentaNotaDebito;
    @Inject
    private IServicioTipoMoneda servicioTipoMoneda;
    @Inject
    private IServicioTipoDocumento servicioTipoDocumento;
    /*@Inject
     private IServicioUnidadMedidaComp servicioUnidadMedidaComp;
     @Inject
     private IServicioProducto servicioProducto;*/
    @Inject
    private IServicioIgv servicioIgv;
    @Inject
    private IServicioTipoFormaPago servicioTipoFormaPago;
    @Inject
    private MBComponenteFindCliente mbComponenteFindCliente;
    @Inject
    private MBComponenteFindAddArticulo mbComponenteFindAddArticulo;
    @Inject
    private IServicioTipoCambio servicioTipoCambio;
    /*@Inject
     private BKVentaLineaCredito bkVentaLineaCredito;
     @Inject
     private BKVentaLineaCreditoDetalle bkVentaLineaCreditoDetalle;*/
    @Inject
    private IServicioVentaLineaCredito servicioVentaLineaCredito;
    @Inject
    private IServicioVentaLineaCreditoDetalle servicioVentaLineaCreditoDetalle;
    @Inject
    private IServicioParametroDetalle servicioParametroDetalle;
    /*@Inject
     private IServicioCorrelativoDocumento servicioCorrelativoDocumento;*/
    @Inject
    private IServicioCorrelativoDocumento servicioCorrelativo;
    @Inject
    private KardexModel kardexModel;
    @Inject
    private IServicioParametro servicioParametro;
    @Inject
    private IServicioKardex servicioKardex;
    @Autowired
    BKSession session;

    @Override
    public String actualizar() {
        try {
            if (bkVentaFacturacion.getIdTipoFormaPago() == TIPO_FORMA_PAGO.CREDITO.getValor()) {
                VentaLineaCredito linea = servicioVentaLineaCredito.getVentaLineaCredito(bkVentaFacturacion.getVentaFacturacionFormulario().getRuc());
                if (linea == null) {
                    mostrarWarning("El cliente no tiene linea de credito asignado.");
                    return URLPaginacion.Ventas.URL_FORMULARIO_FACTURA;
                } else if (linea.getLineaSaldo() < bkVentaFacturacion.getVentaFacturacionFormulario().getPrecioVenta()) {
                    mostrarWarning("Linea de credito insuficiente.");
                    return URLPaginacion.Ventas.URL_FORMULARIO_FACTURA;
                }
            }
            bkVentaFacturacion.getVentaFacturacionFormulario().setFormaPago(servicioTipoFormaPago.conseguirTipoFormaPagoPorId(bkVentaFacturacion.getIdTipoFormaPago()));
            bkVentaFacturacion.getVentaFacturacionFormulario().setVendedor(session.getUsuario().getId());
            bkVentaFacturacion.getVentaFacturacionFormulario().setFecModificacion(new Date());
            bkVentaFacturacion.getVentaFacturacionFormulario().setUsrModificacion(session.getUsuario().getUsuario());
            if (bkVentaFacturacion.getVentaFacturacionFormulario().getFechVencimiento() == null) {
                bkVentaFacturacion.getVentaFacturacionFormulario().setFechVencimiento(new Date());
            }
            servicioVentaFacturacion.actualizarVentaFacturacion(bkVentaFacturacion.getVentaFacturacionFormulario());
            List<VentaDetalleFacturacion> listaAux = new ArrayList<VentaDetalleFacturacion>();
            for (VentaDetalleFacturacion detalle : bkVentaDetalleFacturacion.getListaDetalleFacturacion()) {
                listaAux.add(detalle);
            }

            servicioVentaFacturacion.eliminarDetalleFactura(bkVentaFacturacion.getVentaFacturacionFormulario().getCoddocventa());


            //guardamos el detalle
            int num_factura = 1;
            for (VentaDetalleFacturacion detalle : listaAux) {
                detalle.setVentaDetalleFacturacionPK(new VentaDetalleFacturacionPK(num_factura, bkVentaFacturacion.getVentaFacturacionFormulario().getCoddocventa()));
                detalle.setFecCreacion(new Date());
                servicioVentaDetalleFacturacion.guardarVentaDetalleFacturacion(detalle);
                num_factura++;
            }
            mostrarMensaje("Se actualizó la Factura satisfactoriamente.");
            bkVentaFacturacion.setVentaFacturacionSeleccionado(bkVentaFacturacion.getVentaFacturacionFormulario());
            return editar();
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_FORMULARIO_FACTURA;
        }
    }

    @Override
    public String guardar() {
        boolean flag = true;
        try {
            flag = servicioVentaFacturacion.esNumeroDocCorrecta(bkVentaFacturacion.getVentaFacturacionFormulario());

            if (flag) {
                mostrarError("El número de Factura ya ha sido registrado.");
                return URLPaginacion.Ventas.URL_FORMULARIO_FACTURA;
            }

            if (bkVentaFacturacion.getIdTipoFormaPago() == TIPO_FORMA_PAGO.CREDITO.getValor()) {
                VentaLineaCredito linea = servicioVentaLineaCredito.getVentaLineaCredito(bkVentaFacturacion.getVentaFacturacionFormulario().getRuc());
                if (linea == null) {
                    mostrarWarning("El cliente no tiene linea de credito asignado.");
                    return URLPaginacion.Ventas.URL_FORMULARIO_FACTURA;
                } else if (linea.getLineaSaldo() < bkVentaFacturacion.getVentaFacturacionFormulario().getPrecioVenta()) {
                    mostrarWarning("Linea de credito insuficiente.");
                    return URLPaginacion.Ventas.URL_FORMULARIO_FACTURA;
                }
            }
            //bkVentaFacturacion.getVentaFacturacionFormulario().setMoneda(servicioTipoMoneda.conseguirTipoMonedaPorId(bkVentaFacturacion.getIdTipoMoneda()));
            bkVentaFacturacion.getVentaFacturacionFormulario().setFormaPago(servicioTipoFormaPago.conseguirTipoFormaPagoPorId(bkVentaFacturacion.getIdTipoFormaPago()));
            bkVentaFacturacion.getVentaFacturacionFormulario().setVendedor(session.getUsuario().getId());
            bkVentaFacturacion.getVentaFacturacionFormulario().setPorCobrar(bkVentaFacturacion.getVentaFacturacionFormulario().getPrecioVenta());
            bkVentaFacturacion.getVentaFacturacionFormulario().setFecCreacion(new Date());
            bkVentaFacturacion.getVentaFacturacionFormulario().setUsrCreacion(session.getUsuario().getUsuario());
            bkVentaFacturacion.getVentaFacturacionFormulario().setNumFactura(UtilitarioCadenas.formatoNumeroDocumento(Integer.parseInt(bkVentaFacturacion.getVentaFacturacionFormulario().getNumFactura())));
            if (bkVentaFacturacion.getVentaFacturacionFormulario().getFechVencimiento() == null) {
                bkVentaFacturacion.getVentaFacturacionFormulario().setFechVencimiento(new Date());
            }

            ResultadoServicio rs = servicioVentaFacturacion.guardarVentaFacturacion(bkVentaFacturacion.getVentaFacturacionFormulario());
            Integer ID = (Integer) rs.getID();

            if (!bkVentaFacturacion.getVentaFacturacionFormulario().getGuiaRem().equalsIgnoreCase("")) {
                VentaFacturacion guia = bkVentaFacturacion.getVentaFacturacionSeleccionado();
                guia.setCoddocbase(ID);
                guia.setUsrModificacion(session.getUsuario().getUsuario());
                guia.setFecModificacion(new Date());
                servicioVentaFacturacion.actualizarVentaFacturacion(guia);

            }

            CorrelativoDocumento correlativo = new CorrelativoDocumento();
            TipoDocumento tipoDocumento = new TipoDocumento();
            tipoDocumento.setNombre(Constantes.TipoDocumento.TIPO_DOC_FACTURA_VENTA);

            Integer numero = Integer.parseInt(bkVentaFacturacion.getVentaFacturacionFormulario().getNumFactura()) + 1;
            correlativo.setIdTipoDocumento(servicioTipoDocumento.obtenerTipoDocumentoPorNombre(tipoDocumento));
            correlativo.setIdsede(session.getSede());
            correlativo.setSerie(bkVentaFacturacion.getVentaFacturacionFormulario().getSerieFactura());
            CorrelativoDocumento correlativoEncontrado = servicioCorrelativo.obtenerCorrelativoTipoDocSede1(correlativo);

            if (numero > Integer.parseInt(correlativoEncontrado.getNumero())) {
                correlativoEncontrado.setNumero(UtilitarioCadenas.formatoNumeroDocumento(numero));
                servicioCorrelativo.actualizarCorrelativoDocumento(correlativoEncontrado);
            }
            //guardamos el detalle
            int num_factura = 1;
            for (VentaDetalleFacturacion detalle : bkVentaDetalleFacturacion.getListaDetalleFacturacion()) {
                detalle.setVentaDetalleFacturacionPK(new VentaDetalleFacturacionPK(num_factura, ID));
                detalle.setFecCreacion(new Date());
                servicioVentaDetalleFacturacion.guardarVentaDetalleFacturacion(detalle);
                num_factura++;
            }
            mostrarMensaje("Se guardó la Factura satisfactoriamente.");
            bkVentaFacturacion.setVentaFacturacionSeleccionado(bkVentaFacturacion.getVentaFacturacionFormulario());
            return editar();
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_FORMULARIO_FACTURA;
        }
    }

    @Override
    public void eliminar(ActionEvent actionEvent) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String editar() {
        mbComponenteFindCliente.clearObserver();
        mbComponenteFindCliente.addObserver(this);

        mbComponenteFindAddArticulo.clearObserver();
        mbComponenteFindAddArticulo.addObserver(this);
        //mbComponenteFindAddArticulo.cargaInicial();
        bkVentaFacturacion.setComando(new ComandoActualizar(this));
        try {
            bkVentaFacturacion.setListaTipoMoneda(new ArrayList<TipoMoneda>(servicioTipoMoneda.listarTipoMonedasActivos()));
            bkVentaFacturacion.setListaTipoFormaPago(new ArrayList<TipoFormaPago>(servicioTipoFormaPago.obtenerTipoFormaPagoActivos()));
            bkVentaDetalleFacturacion.setListaDetalleFacturacion(new ArrayList<VentaDetalleFacturacion>());
            bkVentaFacturacion.setVentaFacturacionFormulario(bkVentaFacturacion.getVentaFacturacionSeleccionado());
            //(new VentaFacturacion());
            bkVentaFacturacion.setIdTipoMoneda(servicioVentaFacturacion.obtenerIdMonedaFacturacion(bkVentaFacturacion.getVentaFacturacionFormulario().getCoddocventa()));
            bkVentaFacturacion.setIdTipoFormaPago(servicioVentaFacturacion.obtenerIdFormaPagoFacturacion(bkVentaFacturacion.getVentaFacturacionFormulario().getCoddocventa()));
            bkVentaFacturacion.setNumero(bkVentaFacturacion.getVentaFacturacionFormulario().getSerieFactura().concat(bkVentaFacturacion.getVentaFacturacionFormulario().getNumFactura()));
            bkVentaDetalleFacturacion.setListaDetalleFacturacion(new ArrayList<VentaDetalleFacturacion>());

            bkVentaDetalleFacturacion.setListaDetalleFacturacion(servicioVentaDetalleFacturacion.obtenerVentaDetalleFacturacion(bkVentaFacturacion.getVentaFacturacionFormulario().getCoddocventa()));
            actualizarEstado();

            //return URLPaginacion.Ventas.URL_FORMULARIO_EDITAR_FACTURA;
            return URLPaginacion.Ventas.URL_FORMULARIO_FACTURA;
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_LISTA_FACTURA;
        }
    }

    @Override
    public String nuevo() {
        mbComponenteFindCliente.clearObserver();
        mbComponenteFindCliente.addObserver(this);

        mbComponenteFindAddArticulo.clearObserver();
        mbComponenteFindAddArticulo.addObserver(this);
        //mbComponenteFindAddArticulo.cargaInicial();
        bkVentaFacturacion.setComando(new ComandoGuardar(this));
        try {
            //cargar correlativo

            VentaFacturacion documento = new VentaFacturacion();
            documento.setDatosDestina("");
            documento.setDomiPartida("");
            documento.setNOcliente("");
            documento.setGuiaRem("");
            documento.setDomiLlegada("");
            documento.setFechEntrega(new Date());
            documento.setFechDocventa(new Date());
            //documento.setFechVencimiento(new Date());
            documento.setTipoCompago(TIPO_DOC_VENTA.FACTURA.getValor());
            documento.setEstado(COLOR_ESTADO_VENTA.CREADA.getEstado());
            documento.setSede(session.getSede());
            List<TipoCambio> lista = (List<TipoCambio>) servicioTipoCambio.listarTipoCambiosPorFiltro(new Date(), new Date());
            if (lista.isEmpty()) {
                mostrarError("Ingresar el Tipo de Cambio del día de hoy");
                return URLPaginacion.Ventas.URL_LISTA_FACTURA;
            } else {
                documento.setTipoCambio(lista.get(0).getVenta().doubleValue());

            }

            TipoDocumento tipoDocumento = new TipoDocumento();
            tipoDocumento.setNombre(Constantes.TipoDocumento.TIPO_DOC_FACTURA_VENTA);
            CorrelativoDocumento correlativo = new CorrelativoDocumento();
            correlativo.setIdsede(session.getSede());
            correlativo.setIdTipoDocumento(servicioTipoDocumento.obtenerTipoDocumentoPorNombre(tipoDocumento));
            bkVentaFacturacion.setListaCorrelativos(servicioCorrelativo.listarCorrelativoPorDocumentoYSede(correlativo));

            for (ParametroDetalle param : servicioParametro.listaTipoMotivoGuia()) {

                if (param.getValCadena().equalsIgnoreCase("VENTA")) {
                    documento.setMotTraslado(param.getId());
                }
            }

            bkVentaFacturacion.setVentaFacturacionFormulario(documento);
            bkVentaFacturacion.setIdTipoFormaPago(0);
            bkVentaFacturacion.setVentaFacturacionSeleccionado(new VentaFacturacion());
            bkVentaFacturacion.setListaTipoFormaPago(new ArrayList<TipoFormaPago>(servicioTipoFormaPago.obtenerTipoFormaPagoActivos()));
            bkVentaFacturacion.setListaTipoDocumento(new ArrayList<TipoDocumento>(servicioTipoDocumento.listarTipoDocumentoActivos()));
            bkVentaFacturacion.setListaTipoMoneda(new ArrayList<TipoMoneda>(servicioTipoMoneda.listarTipoMonedasActivos()));
            bkVentaDetalleFacturacion.setListaDetalleFacturacion(new ArrayList<VentaDetalleFacturacion>());

            /*bkVentaFacturacion.setIdTipoMotivo(0);
             bkVentaFacturacion.setIdTipoMoneda(0);*/



        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_LISTA_FACTURA;
        }
        return URLPaginacion.Ventas.URL_FORMULARIO_FACTURA;
    }

    @Override
    public String ver() {
        try {
            bkVentaFacturacion.setListaTipoMoneda(new ArrayList<TipoMoneda>(servicioTipoMoneda.listarTipoMonedasActivos()));
            bkVentaFacturacion.setListaTipoDocumento(new ArrayList<TipoDocumento>(servicioTipoDocumento.listarTipoDocumentoActivos()));
            bkVentaFacturacion.setListaTipoFormaPago(new ArrayList<TipoFormaPago>(servicioTipoFormaPago.obtenerTipoFormaPagoActivos()));
            bkVentaDetalleFacturacion.setListaDetalleFacturacion(new ArrayList<VentaDetalleFacturacion>());
            bkVentaFacturacion.setVentaFacturacionFormulario(bkVentaFacturacion.getVentaFacturacionSeleccionado());
            bkVentaFacturacion.setIdTipoMoneda(servicioVentaFacturacion.obtenerIdMonedaFacturacion(bkVentaFacturacion.getVentaFacturacionFormulario().getCoddocventa()));
            bkVentaFacturacion.setIdTipoFormaPago(servicioVentaFacturacion.obtenerIdFormaPagoFacturacion(bkVentaFacturacion.getVentaFacturacionFormulario().getCoddocventa()));

            bkVentaFacturacion.setFormaPagoDesc(servicioTipoFormaPago.conseguirTipoFormaPagoPorId(bkVentaFacturacion.getIdTipoFormaPago()).getNombre());


            bkVentaFacturacion.setNumero(bkVentaFacturacion.getVentaFacturacionFormulario().getSerieFactura() + "-" + bkVentaFacturacion.getVentaFacturacionFormulario().getNumFactura());
            bkVentaDetalleFacturacion.setListaDetalleFacturacion(new ArrayList<VentaDetalleFacturacion>());
            bkVentaDetalleFacturacion.setListaDetalleFacturacion(servicioVentaDetalleFacturacion.obtenerVentaDetalleFacturacion(bkVentaFacturacion.getVentaFacturacionFormulario().getCoddocventa()));
            actualizarEstado();

            return URLPaginacion.Ventas.URL_FORMULARIO_VER_FACTURA;
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_LISTA_FACTURA;
        }
    }

    @Override
    public String aceptar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String retroceder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String cancelar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void actualizarObservador(Object object) {

        if (object instanceof Cliente) {
            Cliente cliente = (Cliente) object;
            bkVentaFacturacion.getVentaFacturacionFormulario().setCodCliente(cliente);
            bkVentaFacturacion.getVentaFacturacionFormulario().setRuc(cliente.getNumeroDocumento());
            bkVentaFacturacion.getVentaFacturacionFormulario().setRazon(cliente.getRazonSocial());
            bkVentaFacturacion.getVentaFacturacionFormulario().setDireccion(cliente.getDireccionLegal());
            if (!bkVentaFacturacion.getVentaFacturacionFormulario().getGuiaRem().equalsIgnoreCase("")) {
                bkVentaFacturacion.getVentaFacturacionFormulario().setGuiaRem("");
                bkVentaDetalleFacturacion.setListaDetalleFacturacion(new ArrayList<VentaDetalleFacturacion>());


                bkVentaFacturacion.getVentaFacturacionFormulario().setValorVenta(null);
                bkVentaFacturacion.getVentaFacturacionFormulario().setIgv(null);
                bkVentaFacturacion.getVentaFacturacionFormulario().setPrecioVenta(null);
                bkVentaFacturacion.getVentaFacturacionFormulario().setValorLetras("");
            }



        }
        if (object instanceof BKComponenteFindAddArticulo) {


            BKComponenteFindAddArticulo comp = (BKComponenteFindAddArticulo) object;
            VentaDetalleFacturacion detalle = new VentaDetalleFacturacion();
            detalle.setCantidad(comp.getCantidad());
            detalle.setPrecUnitario(comp.getPrecioUnitario());
            detalle.setTotal(detalle.getCantidad() * detalle.getPrecUnitario());
            detalle.setUnidad(comp.getArticuloSeleccionado().getUnidadMedida());
            detalle.setCodarticulo(comp.getArticuloSeleccionado().getArticulo());
            detalle.setDescProducto(comp.getDescripcion());
            detalle.setPartida(comp.getArticuloSeleccionado().getPartidaLote());
            detalle.setDescuento(Double.NaN);
            detalle.setUsrCreacion(session.getUsuario().getUsuario());
            detalle.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
            bkVentaDetalleFacturacion.getListaDetalleFacturacion().add(detalle);

            try {
                double total = 0.0;
                double subtotal = 0.0;
                double igv = 0.0;
                for (VentaDetalleFacturacion detallev : bkVentaDetalleFacturacion.getListaDetalleFacturacion()) {
                    total = total + detallev.getTotal();
                }

//                igv = servicioIgv.ConseguirIgvVigente().getMonto().doubleValue() * total / 100;//TODO CORREGIDO
//                subtotal = total - igv;

                /**/
                double valor_igv = servicioIgv.ConseguirIgvVigente().getMonto().doubleValue();
                subtotal = total * 100 / (100 + valor_igv);
                igv = subtotal * valor_igv / 100;
                /**/

                bkVentaFacturacion.getVentaFacturacionFormulario().setValorVenta(subtotal);
                bkVentaFacturacion.getVentaFacturacionFormulario().setIgv(igv);
                bkVentaFacturacion.getVentaFacturacionFormulario().setPrecioVenta(total);
                bkVentaFacturacion.getVentaFacturacionFormulario().setIgvPorcentaje(servicioIgv.ConseguirIgvVigente().getMonto().doubleValue());
                convertirALetra();
            } catch (ServiceException e) {
                mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
                logger.error(e.getMessage(), e);
            }




        }

    }

    public void convertirALetra() {
        if (bkVentaFacturacion.getVentaFacturacionFormulario().getPrecioVenta() != null && bkVentaFacturacion.getVentaFacturacionFormulario().getMoneda().getNombre() != null) {
            System.out.println("convirtiendo");
            UtilitarioNumeroALetras valorLetras = new UtilitarioNumeroALetras();
            DecimalFormat decf = new DecimalFormat("###.##");

            bkVentaFacturacion.getVentaFacturacionFormulario().setValorLetras(valorLetras.Convertir(String.valueOf(decf.format(bkVentaFacturacion.getVentaFacturacionFormulario().getPrecioVenta())), true,
                    bkVentaFacturacion.getVentaFacturacionFormulario().getMoneda().getNombre()));
        }

    }

    public String mostrarFacturas() {

        VentaFacturacion documento = new VentaFacturacion();
        documento.setRazon("");
        documento.setRuc("");
        documento.setNumFactura("");
        documento.setSede(session.getSede());
        documento.setTipoCompago(TIPO_DOC_VENTA.FACTURA.getValor());
        bkVentaFacturacion.setVentaFacturacionBusqueda(new VentaFacturacion());
        bkVentaFacturacion.setBusquedaDel(null);
        bkVentaFacturacion.setBusquedaAl(null);
        documento.setFormaPago(new TipoFormaPago(0));
        bkVentaFacturacion.setListaFacturas(null);
        bkVentaFacturacion.setVentaFacturacionBusqueda(documento);

        try {
            bkVentaFacturacion.setListaTipoFormaPago(new ArrayList<TipoFormaPago>(servicioTipoFormaPago.obtenerTipoFormaPagoActivos()));
        } catch (ServiceException e) {
            e.printStackTrace();
        }

        return URLPaginacion.Ventas.URL_LISTA_FACTURA;
    }

    public void buscarListaFacturas() {
        try {
            bkVentaFacturacion.setListaFacturas(servicioVentaFacturacion.obtenerVentaFacturacionBusqueda(
                    bkVentaFacturacion.getVentaFacturacionBusqueda(), bkVentaFacturacion.getBusquedaDel(), bkVentaFacturacion.getBusquedaAl()));
            System.out.println("");
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public String mostrarRegistroVentas() {
        try {
            bkVentaFacturacion.setBusquedaAl(new Date());
            bkVentaFacturacion.setBusquedaDel(new Date());
            bkVentaFacturacion.setListaTipoMoneda(new ArrayList<TipoMoneda>(servicioTipoMoneda.listarTipoMonedasActivos()));
            bkVentaFacturacion.setListaRegistroVentas(null);
        } catch (ServiceException ex) {
            java.util.logging.Logger.getLogger(MBVentaFacturacion.class.getName()).log(Level.SEVERE, null, ex);
        }
        return URLPaginacion.Ventas.URL_LISTA_REGISTRO_VENTAS;
    }

    public String buscarRegistroVentas() {

        bkVentaFacturacion.setSubtotalRV(0);
        bkVentaFacturacion.setIgvRV(0);
        bkVentaFacturacion.setTotalRV(0);

        SimpleDateFormat dateFormatInit = new SimpleDateFormat("yyyy-MM-dd");
        List<VentaFacturacion> lista = new ArrayList<VentaFacturacion>();
        List<VentaNotaCredito> lista2 = new ArrayList<VentaNotaCredito>();
        List<VentaNotaDebito> lista3 = new ArrayList<VentaNotaDebito>();

        bkVentaFacturacion.setListaRegistroVentas(new ArrayList<RegistroVentas>());
        String inicio = dateFormatInit.format(bkVentaFacturacion.getBusquedaDel());
        String fin = dateFormatInit.format(bkVentaFacturacion.getBusquedaAl());

        try {
            lista = servicioVentaFacturacion.obtenerFacturasRV(inicio, fin, session.getSede().getId());
            lista2 = servicioVentaNotaCredito.obtenerNotaCreditoRV(inicio, fin, session.getSede().getId());
            lista3 = servicioVentaNotaDebito.obtenerNotaDebitoRV(inicio, fin, session.getSede().getId());
        } catch (ServiceException e) {
            e.printStackTrace();
        }


        //obtenemos las facturas y boletas
        if (bkVentaFacturacion.getIdTipoMoneda() == TIPO_MONEDA.SOLES.getValor() || bkVentaFacturacion.getIdTipoMoneda() == 0) {
            for (VentaFacturacion fFacturacion : lista) {
                RegistroVentas rv = new RegistroVentas();
                rv.setFechaemision(fFacturacion.getFechDocventa());
                rv.setRuc(fFacturacion.getRuc());
                rv.setTc(fFacturacion.getTipoCambio());
                rv.setRazon(fFacturacion.getRazon());

                if (fFacturacion.getTipoCompago() == TIPO_DOC_VENTA.FACTURA.getValor()) {
                    rv.setNumerodoc("FA/" + fFacturacion.getSerieFactura() + "-" + fFacturacion.getNumFactura());
                    rv.setTipodoc("FA");
                    rv.setColor("blue");
                } else if (fFacturacion.getTipoCompago() == TIPO_DOC_VENTA.BOLETA.getValor()) {
                    rv.setNumerodoc("BV/" + fFacturacion.getSerieFactura() + "-" + fFacturacion.getNumFactura());
                    rv.setTipodoc("BV");
                    rv.setColor("green");
                }
                if (fFacturacion.getMoneda().getId() == TIPO_MONEDA.SOLES.getValor()) {
                    rv.setIgv(fFacturacion.getIgv());
                    rv.setValorventa(fFacturacion.getValorVenta());
                    rv.setTotal(fFacturacion.getPrecioVenta());
                } else if (fFacturacion.getMoneda().getId() == TIPO_MONEDA.DOLARES.getValor()) {
                    rv.setIgv(fFacturacion.getIgv() * fFacturacion.getTipoCambio());
                    rv.setValorventa(fFacturacion.getValorVenta() * fFacturacion.getTipoCambio());
                    rv.setTotal(fFacturacion.getPrecioVenta() * fFacturacion.getTipoCambio());
                }
                if (fFacturacion.getEstado().toString().equals("A")) {
                    rv.setIgv(0);
                    rv.setValorventa(0);
                    rv.setTotal(0);
                    rv.setColor("red");
                }
                bkVentaFacturacion.getListaRegistroVentas().add(rv);

            }

            for (VentaNotaCredito fNotacredito : lista2) {
                RegistroVentas rv = new RegistroVentas();
                rv.setFechaemision(fNotacredito.getFechanc());
                rv.setRuc(fNotacredito.getRuc());
                rv.setTc(fNotacredito.getTipocambio());
                rv.setRazon(fNotacredito.getEmpresa());
                rv.setNumerodoc("NC/" + fNotacredito.getNumnc());
                rv.setTipodoc("NC");

                if (fNotacredito.getMoneda().getId() == TIPO_MONEDA.SOLES.getValor()) {
                    rv.setIgv(fNotacredito.getIgv());
                    rv.setValorventa(fNotacredito.getImporte());
                    rv.setTotal(fNotacredito.getTotal());
                } else if (fNotacredito.getMoneda().getId() == TIPO_MONEDA.DOLARES.getValor()) {
                    rv.setIgv(fNotacredito.getIgv() * fNotacredito.getTipocambio());
                    rv.setValorventa(fNotacredito.getImporte() * fNotacredito.getTipocambio());
                    rv.setTotal(fNotacredito.getTotal() * fNotacredito.getTipocambio());
                }
                if (fNotacredito.getEstado().toString().equals("A")) {
                    rv.setIgv(0);
                    rv.setValorventa(0);
                    rv.setTotal(0);
                    rv.setColor("red");
                }
                bkVentaFacturacion.getListaRegistroVentas().add(rv);

            }

            for (VentaNotaDebito fNotadebito : lista3) {
                RegistroVentas rv = new RegistroVentas();
                rv.setFechaemision(fNotadebito.getFechand());
                rv.setRuc(fNotadebito.getRuc());
                rv.setTc(fNotadebito.getTipocamb());
                rv.setRazon(fNotadebito.getEmpresa());
                rv.setNumerodoc("ND/" + fNotadebito.getNumnd());
                rv.setTipodoc("ND");

                if (fNotadebito.getMoneda().getId() == TIPO_MONEDA.SOLES.getValor()) {
                    rv.setIgv(fNotadebito.getIgv());
                    rv.setValorventa(fNotadebito.getImporte());
                    rv.setTotal(fNotadebito.getTotal());
                } else if (fNotadebito.getMoneda().getId() == TIPO_MONEDA.DOLARES.getValor()) {
                    rv.setIgv(fNotadebito.getIgv() * fNotadebito.getTipocamb());
                    rv.setValorventa(fNotadebito.getImporte() * fNotadebito.getTipocamb());
                    rv.setTotal(fNotadebito.getTotal() * fNotadebito.getTipocamb());
                }
                if (fNotadebito.getEstado().toString().equals("A")) {
                    rv.setIgv(0);
                    rv.setValorventa(0);
                    rv.setTotal(0);
                    rv.setColor("red");
                }
                bkVentaFacturacion.getListaRegistroVentas().add(rv);

            }

        } else if (bkVentaFacturacion.getIdTipoMoneda() == TIPO_MONEDA.DOLARES.getValor()) {
            for (VentaFacturacion fFacturacion : lista) {
                RegistroVentas rv = new RegistroVentas();
                rv.setFechaemision(fFacturacion.getFechDocventa());
                rv.setRuc(fFacturacion.getRuc());
                rv.setTc(fFacturacion.getTipoCambio());
                rv.setRazon(fFacturacion.getRazon());

                if (fFacturacion.getTipoCompago() == TIPO_DOC_VENTA.FACTURA.getValor()) {
                    rv.setNumerodoc("FA/" + fFacturacion.getSerieFactura() + "-" + fFacturacion.getNumFactura());
                    rv.setTipodoc("FA");
                    rv.setColor("blue");
                } else if (fFacturacion.getTipoCompago() == TIPO_DOC_VENTA.BOLETA.getValor()) {
                    rv.setNumerodoc("BV/" + fFacturacion.getSerieFactura() + "-" + fFacturacion.getNumFactura());
                    rv.setTipodoc("BV");
                    rv.setColor("green");
                }
                if (fFacturacion.getMoneda().getId() == TIPO_MONEDA.DOLARES.getValor()) {
                    rv.setIgv(fFacturacion.getIgv());
                    rv.setValorventa(fFacturacion.getValorVenta());
                    rv.setTotal(fFacturacion.getPrecioVenta());
                } else if (fFacturacion.getMoneda().getId() == TIPO_MONEDA.SOLES.getValor()) {
                    rv.setIgv(fFacturacion.getIgv() / fFacturacion.getTipoCambio());
                    rv.setValorventa(fFacturacion.getValorVenta() / fFacturacion.getTipoCambio());
                    rv.setTotal(fFacturacion.getPrecioVenta() / fFacturacion.getTipoCambio());
                }
                if (fFacturacion.getEstado().toString().equals("A")) {
                    rv.setIgv(0);
                    rv.setValorventa(0);
                    rv.setTotal(0);
                    rv.setColor("red");
                }
                bkVentaFacturacion.getListaRegistroVentas().add(rv);
            }


            for (VentaNotaCredito fNotacredito : lista2) {
                RegistroVentas rv = new RegistroVentas();
                rv.setFechaemision(fNotacredito.getFechanc());
                rv.setRuc(fNotacredito.getRuc());
                rv.setTc(fNotacredito.getTipocambio());
                rv.setRazon(fNotacredito.getEmpresa());
                rv.setNumerodoc("NC/" + fNotacredito.getNumnc());
                rv.setTipodoc("NC");

                if (fNotacredito.getMoneda().getId() == TIPO_MONEDA.DOLARES.getValor()) {
                    rv.setIgv(fNotacredito.getIgv());
                    rv.setValorventa(fNotacredito.getImporte());
                    rv.setTotal(fNotacredito.getTotal());
                } else if (fNotacredito.getMoneda().getId() == TIPO_MONEDA.SOLES.getValor()) {
                    rv.setIgv(fNotacredito.getIgv() / fNotacredito.getTipocambio());
                    rv.setValorventa(fNotacredito.getImporte() / fNotacredito.getTipocambio());
                    rv.setTotal(fNotacredito.getTotal() / fNotacredito.getTipocambio());
                }
                if (fNotacredito.getEstado().toString().equals("A")) {
                    rv.setIgv(0);
                    rv.setValorventa(0);
                    rv.setTotal(0);
                    rv.setColor("red");
                }
                bkVentaFacturacion.getListaRegistroVentas().add(rv);

            }

            for (VentaNotaDebito fNotadebito : lista3) {
                RegistroVentas rv = new RegistroVentas();
                rv.setFechaemision(fNotadebito.getFechand());
                rv.setRuc(fNotadebito.getRuc());
                rv.setTc(fNotadebito.getTipocamb());
                rv.setRazon(fNotadebito.getEmpresa());
                rv.setNumerodoc("ND/" + fNotadebito.getNumnd());
                rv.setTipodoc("ND");

                if (fNotadebito.getMoneda().getId() == TIPO_MONEDA.DOLARES.getValor()) {
                    rv.setIgv(fNotadebito.getIgv());
                    rv.setValorventa(fNotadebito.getImporte());
                    rv.setTotal(fNotadebito.getTotal());
                } else if (fNotadebito.getMoneda().getId() == TIPO_MONEDA.SOLES.getValor()) {
                    rv.setIgv(fNotadebito.getIgv() / fNotadebito.getTipocamb());
                    rv.setValorventa(fNotadebito.getImporte() / fNotadebito.getTipocamb());
                    rv.setTotal(fNotadebito.getTotal() / fNotadebito.getTipocamb());
                }
                if (fNotadebito.getEstado().toString().equals("A")) {
                    rv.setIgv(0);
                    rv.setValorventa(0);
                    rv.setTotal(0);
                    rv.setColor("red");
                }
                bkVentaFacturacion.getListaRegistroVentas().add(rv);

            }

        }
        calculoTotales();
        return "";
    }

    private void calculoTotales() {
        double sumasubtotal = 0;
        double sumaigv = 0;
        double sumatotal = 0;

        for (RegistroVentas registroVentas : bkVentaFacturacion.getListaRegistroVentas()) {
            if (!registroVentas.getTipodoc().equals("NC")) {

                sumaigv = sumaigv + registroVentas.getIgv();
                sumasubtotal = sumasubtotal + registroVentas.getValorventa();
                sumatotal = sumatotal + registroVentas.getTotal();
            } else {
                sumaigv = sumaigv - registroVentas.getIgv();
                sumasubtotal = sumasubtotal - registroVentas.getValorventa();
                sumatotal = sumatotal - registroVentas.getTotal();
            }
        }
        bkVentaFacturacion.setSubtotalRV(sumasubtotal);
        bkVentaFacturacion.setIgvRV(sumaigv);
        bkVentaFacturacion.setTotalRV(sumatotal);
    }

    public void imprimirRegistroVentas() {

        bkVentaFacturacion.getListaReporteVentas().clear();
        InputStream reportIS = null;
        try {
            bkVentaFacturacion.setSubtotalRV(0);
            bkVentaFacturacion.setIgvRV(0);
            bkVentaFacturacion.setTotalRV(0);

            SimpleDateFormat dateFormatInit = new SimpleDateFormat("yyyy-MM-dd");
            SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
            List<VentaFacturacion> lista = new ArrayList<VentaFacturacion>();
            List<VentaNotaCredito> lista2 = new ArrayList<VentaNotaCredito>();
            List<VentaNotaDebito> lista3 = new ArrayList<VentaNotaDebito>();

            DecimalFormat df = new DecimalFormat("#,###.00");

            bkVentaFacturacion.setListaReporteVentas(new ArrayList<ReporteVentas>());
            String inicio = dateFormatInit.format(bkVentaFacturacion.getBusquedaDel());
            String fin = dateFormatInit.format(bkVentaFacturacion.getBusquedaAl());

            try {
                lista = servicioVentaFacturacion.obtenerFacturasRV(inicio, fin, session.getSede().getId());
                lista2 = servicioVentaNotaCredito.obtenerNotaCreditoRV(inicio, fin, session.getSede().getId());
                lista3 = servicioVentaNotaDebito.obtenerNotaDebitoRV(inicio, fin, session.getSede().getId());
            } catch (ServiceException e) {
                e.printStackTrace();
            }


            //obtenemos las facturas y boletas

            for (VentaFacturacion fFacturacion : lista) {
                ReporteVentas rv = new ReporteVentas();


                rv.setTc(df.format(fFacturacion.getTipoCambio()));

                rv.setCliente(fFacturacion.getRazon());
                rv.setFecha(dateFormat.format(fFacturacion.getFechDocventa()));
                rv.setSerie(fFacturacion.getSerieFactura());
                rv.setNdoc(fFacturacion.getNumFactura());

                if (fFacturacion.getTipoCompago() == TIPO_DOC_VENTA.FACTURA.getValor()) {
                    rv.setTd("FA");
                    if (fFacturacion.getFormaPago().getId() == TIPO_FORMA_PAGO.CONTADO.getValor()) {
                        rv.setEfch("EF");
                    } else if (fFacturacion.getFormaPago().getId() == TIPO_FORMA_PAGO.CREDITO.getValor()) {
                        rv.setObservaciones("CREDITO");
                    }
                } else if (fFacturacion.getTipoCompago() == TIPO_DOC_VENTA.BOLETA.getValor()) {
                    rv.setTd("BV");
                }

                if (fFacturacion.getMoneda().getId() == TIPO_MONEDA.SOLES.getValor()) {
                    rv.setImpfactsoles(df.format(fFacturacion.getValorVenta()));
                } else if (fFacturacion.getMoneda().getId() == TIPO_MONEDA.DOLARES.getValor()) {
                    rv.setImpfactdolares(df.format(fFacturacion.getValorVenta()));
                }
                if (fFacturacion.getEstado().toString().equals("A")) {
                    rv.setImpfactsoles("");
                    rv.setImpfactdolares("");
                }
                bkVentaFacturacion.getListaReporteVentas().add(rv);

            }

            for (VentaNotaCredito fNotacredito : lista2) {
                ReporteVentas rv = new ReporteVentas();
                rv.setTc(df.format(fNotacredito.getTipocambio()));

                rv.setCliente(fNotacredito.getEmpresa());
                rv.setFecha(dateFormat.format(fNotacredito.getFechanc()));
                rv.setSerie(fNotacredito.getSerienc());
                rv.setNdoc(fNotacredito.getNumnc());
                rv.setTd("NC");
                rv.setObservaciones("");

                if (fNotacredito.getMoneda().getId() == TIPO_MONEDA.SOLES.getValor()) {
                    rv.setImpfactsoles(df.format(fNotacredito.getTotal()));
                } else if (fNotacredito.getMoneda().getId() == TIPO_MONEDA.DOLARES.getValor()) {
                    rv.setImpfactdolares(df.format(fNotacredito.getTotal()));
                }
                if (fNotacredito.getEstado().toString().equals("A")) {
                    rv.setImpfactsoles("");
                    rv.setImpfactdolares("");
                }
                bkVentaFacturacion.getListaReporteVentas().add(rv);

            }

            for (VentaNotaDebito fNotadebito : lista3) {
                ReporteVentas rv = new ReporteVentas();
                rv.setCliente(fNotadebito.getEmpresa());
                rv.setFecha(dateFormat.format(fNotadebito.getFechand()));
                rv.setSerie(fNotadebito.getSeriend());
                rv.setNdoc(fNotadebito.getNumnd());
                rv.setTd("NC");
                rv.setObservaciones("");

                if (fNotadebito.getMoneda().getId() == TIPO_MONEDA.SOLES.getValor()) {
                    rv.setImpfactsoles(df.format(fNotadebito.getTotal()));
                } else if (fNotadebito.getMoneda().getId() == TIPO_MONEDA.DOLARES.getValor()) {
                    rv.setImpfactdolares(df.format(fNotadebito.getTotal()));
                }
                if (fNotadebito.getEstado().toString().equals("A")) {
                    rv.setImpfactsoles("");
                    rv.setImpfactdolares("");
                }
                bkVentaFacturacion.getListaReporteVentas().add(rv);
            }


            System.out.println(" ** JASPER PDF");

//                FacesContext facesContext = FacesContext.getCurrentInstance();
//                HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
//                
//
//                String reportSource = "C:\\reporteVentas.jasper";
//
//                JRBeanArrayDataSource dataSource = new JRBeanArrayDataSource(bkVentaFacturacion.getListaReporteVentas().toArray());
//                reportIS = new FileInputStream(reportSource);
//                //InputStream reportIS = request.getSession().getServletContext().getResourceAsStream(reportSource);
//                if(reportIS == null){
//                    System.out.println(reportSource+"no existe");
//                }else{
//                    System.out.println(reportSource+"existe");
//                }
//
//                Map parametros = new HashMap();
//                        
//                JasperPrint jasperPrint = JasperFillManager.fillReport(reportSource, parametros, dataSource);
//                byte[] bytes = JasperExportManager.exportReportToPdf(jasperPrint);
//
//                response.setContentType ("application/pdf");
//                response.setHeader("Content-disposition","attachment;filename=RegistroVentas.pdf");
//                response.setHeader("Pragma", "No-cache");
//                response.setHeader("Cache-Control", "cache");
//                response.setHeader("Cache-Control", "max-age=30");
//                response.setHeader("Window-target", "_blank");
//                response.setContentLength(bytes.length);
//                response.getOutputStream().write(bytes);
//                facesContext.responseComplete();


            System.out.println("tama;o de lista " + bkVentaFacturacion.getListaReporteVentas().size());
            Map parametros = new HashMap();
            JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(bkVentaFacturacion.getListaReporteVentas());

            //JasperReport jasperReport = (JasperReport) JRLoader.loadObject(getClass().getClassLoader().getResourceAsStream("C:\\reporteVentas.jasper"));
            String reportSource = serviceProperties.getProperty("path.server.documento.venta") + "reporteVentas.jasper";
            reportIS = new FileInputStream(reportSource);
            JasperPrint print = JasperFillManager.fillReport(reportIS, new HashMap(), ds);
            JasperExportManager.exportReportToPdfFile(print, serviceProperties.getProperty("path.server.documento.venta") + "reporteVentas.pdf");

//                byte[] bytes = JasperExportManager.exportReportToPdf(print);
//                FacesContext context = FacesContext.getCurrentInstance();
//                HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();
//
//                response.addHeader("Content-disposition",
//                        "attachment;filename=reporte.pdf");
//                response.setContentLength(bytes.length);
//                response.getOutputStream().write(bytes);
//                response.setContentType("application/pdf");
//                context.responseComplete();

            String reporte = serviceProperties.getProperty("path.server.documento.venta") + "reporteVentas.pdf";
            InputStream stream = new FileInputStream(reporte);
            bkVentaFacturacion.setFile(new DefaultStreamedContent(stream, "application/pdf", "RegistroVentas.pdf"));




        } catch (FileNotFoundException ex) {
            ex.printStackTrace();
            java.util.logging.Logger.getLogger(MBVentaFacturacion.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException io) {
            io.printStackTrace();
            java.util.logging.Logger.getLogger(MBVentaFacturacion.class.getName()).log(Level.SEVERE, null, io);
        } catch (JRException ex) {
            ex.printStackTrace();
            java.util.logging.Logger.getLogger(MBVentaFacturacion.class.getName()).log(Level.SEVERE, null, ex);
        } /*finally {
         try {
         reportIS.close();
         } catch (IOException ex) {
         java.util.logging.Logger.getLogger(MBVentaFacturacion.class.getName()).log(Level.SEVERE, null, ex);
         }
         }*/


    }

    public String anular() {

        if (bkVentaFacturacion.getVentaFacturacionFormulario().getEstado() == COLOR_ESTADO_VENTA.EMITIDO.getEstado()) {
            Collection<Kardex> listaKardex = new ArrayList<Kardex>();

            try {
                listaKardex = servicioKardex.buscarKardexPorVenta(bkVentaFacturacion.getVentaFacturacionFormulario().getCoddocventa());
            } catch (ServiceException e) {
                e.printStackTrace();
            }
            if (!listaKardex.isEmpty()) {
                try {
                    kardexModel.anularKardex(listaKardex, session.getUsuario().getUsuario());
                } catch (ModelExcepcion e) {
                    e.printStackTrace();
                }
            }
        }

        List<VentaFacturacion> listaGuias = new ArrayList<VentaFacturacion>();
        try {
            listaGuias = servicioVentaFacturacion.obtenerGuiasDeFactura(bkVentaFacturacion.getVentaFacturacionFormulario().getCoddocventa());
        } catch (ServiceException e) {
            e.printStackTrace();
        }
        if (!listaGuias.isEmpty()) {
            for (VentaFacturacion guia : listaGuias) {
                guia.setCoddocbase(null);
                guia.setFecModificacion(new Date());
                guia.setUsrModificacion(session.getUsuario().getUsuario());
                servicioVentaFacturacion.actualizarVentaFacturacion(guia);
            }

        }


        bkVentaFacturacion.getVentaFacturacionFormulario().setEstado(COLOR_ESTADO_VENTA.ANULADO.getEstado());
        bkVentaFacturacion.getVentaFacturacionFormulario().setUsrModificacion(session.getUsuario().getUsuario());
        bkVentaFacturacion.getVentaFacturacionFormulario().setFecModificacion(new Date());
        servicioVentaFacturacion.actualizarVentaFacturacion(bkVentaFacturacion.getVentaFacturacionFormulario());
        actualizarEstado();
        mostrarMensaje("Se anuló la Factura satisfactoriamente.");
        return ver();
    }

    public void exportar() {
    }

    public String imprimir() throws ServiceException {

        if (!VentaFacturacionPrintHelper.verificarImpresora(session.getSede().getRecursoImpresora())) {
            mostrarError("No se pudo conectar con la impresora");
            return URLPaginacion.Ventas.URL_FORMULARIO_VER_FACTURA;
        }

        boolean es_credito = false;
        VentaLineaCreditoDetalle detalle = new VentaLineaCreditoDetalle();
        VentaLineaCredito lineaCredito = new VentaLineaCredito();
        int idformapago = bkVentaFacturacion.getIdTipoFormaPago();//servicioVentaFacturacion.obtenerIdFormaPagoFacturacion(bkVentaFacturacion.getVentaFacturacionFormulario().getCoddocventa());

        bkVentaFacturacion.getVentaFacturacionFormulario().setEstado(COLOR_ESTADO_VENTA.EMITIDO.getEstado());
        if (TIPO_FORMA_PAGO.CREDITO.getValor() == idformapago) {

            try {
                lineaCredito = servicioVentaLineaCredito.getVentaLineaCredito(bkVentaFacturacion.getVentaFacturacionFormulario().getRuc());

                if (lineaCredito != null) {
                    if (lineaCredito.getLineaSaldo() < bkVentaFacturacion.getVentaFacturacionFormulario().getPrecioVenta()) {
                        mostrarWarning("Linea de credito insuficiente.");
                        return URLPaginacion.Ventas.URL_FORMULARIO_FACTURA;
                    } else {
                        es_credito = true;
                    }
                } else {
                    mostrarWarning("El cliente no tiene linea de credito asignado.");
                    return URLPaginacion.Ventas.URL_FORMULARIO_FACTURA;
                }


            } catch (ServiceException e) {
                mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
                logger.error(e.getMessage(), e);
                return URLPaginacion.Ventas.URL_FORMULARIO_FACTURA;
            }

        } else {

            bkVentaFacturacion.getVentaFacturacionFormulario().setEstado(COLOR_ESTADO_VENTA.PAGADA.getEstado());
            bkVentaFacturacion.getVentaFacturacionFormulario().setFecCancelacion(bkVentaFacturacion.getVentaFacturacionFormulario().getFechDocventa());
        }

        try {


            if (bkVentaFacturacion.getComando().getNombre().equalsIgnoreCase("Actualizar")) {
                actualizar();
            } else {
                guardar();
            }

            if (bkVentaFacturacion.getVentaFacturacionFormulario().getCoddocventa() == null) {
                mostrarError("Error al guardar el formulario. Verifique que los datos sean correctos.");
                return URLPaginacion.Ventas.URL_FORMULARIO_FACTURA;
            }

            VentaFacturacionPrintHelper.imprimirFacturaVenta(bkVentaFacturacion.getVentaFacturacionFormulario(),
                    servicioTipoFormaPago.conseguirTipoFormaPagoPorId(idformapago).getNombre(), bkVentaDetalleFacturacion.getListaDetalleFacturacion(), session.getSede().getRecursoImpresora());
            mostrarMensaje("Se lanzó la impresión satisfactoriamente.");

            //actualizarEstado();

            if (bkVentaFacturacion.getVentaFacturacionFormulario().getGuiaRem().equalsIgnoreCase("")) {
                try {
                    kardexModel.realizarKardex(bkVentaFacturacion.getVentaFacturacionFormulario(), session.getUsuario().getUsuario());
                } catch (ModelExcepcion e) {
                    e.printStackTrace();
                    mostrarError("Error al realizar el Kardex.");
                    return URLPaginacion.Ventas.URL_FORMULARIO_FACTURA;
                }
            }

            if (es_credito) {
                detalle.setDetalleConsumo("FA/" + bkVentaFacturacion.getVentaFacturacionFormulario().getSerieFactura() + "-" + bkVentaFacturacion.getVentaFacturacionFormulario().getNumFactura());
                detalle.setMontoConsumo(bkVentaFacturacion.getVentaFacturacionFormulario().getMoneda().getId() == TIPO_MONEDA.SOLES.getValor() ? bkVentaFacturacion.getVentaFacturacionFormulario().getPrecioVenta() : bkVentaFacturacion.getVentaFacturacionFormulario().getPrecioVenta() * bkVentaFacturacion.getVentaFacturacionFormulario().getTipoCambio());
                detalle.setFechaOperacion(bkVentaFacturacion.getVentaFacturacionFormulario().getFechDocventa());
                detalle.setLineaSaldo(lineaCredito.getLineaSaldo() - detalle.getMontoConsumo());
                detalle.setIdlinea(lineaCredito);
                servicioVentaLineaCreditoDetalle.guardarLineaCreditoDetalle(detalle);

                lineaCredito.setLineaUsada(lineaCredito.getLineaUsada() + detalle.getMontoConsumo());
                lineaCredito.setLineaSaldo(lineaCredito.getLineaCredito() - lineaCredito.getLineaUsada());

                servicioVentaLineaCredito.actualizarLineaCredito(lineaCredito);

            }


            return ver();
        } catch (PrinterException e) {
            e.printStackTrace();
            return URLPaginacion.Ventas.URL_FORMULARIO_FACTURA;
        }




    }

    public void eliminarDetalle() {
        if (bkVentaDetalleFacturacion.getDetalleFacturacionSeleccionado().getVentaDetalleFacturacionPK() == null) {
            Iterator itr = bkVentaDetalleFacturacion.getListaDetalleFacturacion().iterator();
            while (itr.hasNext()) {
                VentaDetalleFacturacion det = (VentaDetalleFacturacion) itr.next();

                if (bkVentaDetalleFacturacion.getDetalleFacturacionSeleccionado().getCodarticulo().getId().equals(det.getCodarticulo().getId())) {
                    itr.remove();
                    break;
                }
            }

        } else {
            bkVentaDetalleFacturacion.getListaDetalleFacturacion().remove(bkVentaDetalleFacturacion.getDetalleFacturacionSeleccionado());
        }
        try {
            double total = 0.0;
            double subtotal = 0.0;
            double igv = 0.0;
            for (VentaDetalleFacturacion detallev : bkVentaDetalleFacturacion.getListaDetalleFacturacion()) {
                total = total + detallev.getTotal();
            }


//            igv = servicioIgv.ConseguirIgvVigente().getMonto().doubleValue() * total / 100; //TODO CORREGIDO
//            subtotal = total - igv;

            /**/
            double valor_igv = servicioIgv.ConseguirIgvVigente().getMonto().doubleValue();
            subtotal = total * 100 / (100 + valor_igv);
            igv = subtotal * valor_igv / 100;
            /**/

            bkVentaFacturacion.getVentaFacturacionFormulario().setValorVenta(subtotal);
            bkVentaFacturacion.getVentaFacturacionFormulario().setIgv(igv);
            bkVentaFacturacion.getVentaFacturacionFormulario().setPrecioVenta(total);
            bkVentaFacturacion.getVentaFacturacionFormulario().setIgvPorcentaje(servicioIgv.ConseguirIgvVigente().getMonto().doubleValue());
            convertirALetra();
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public void actualizarEstado() {


        if (bkVentaFacturacion.getVentaFacturacionFormulario().getEstado() == COLOR_ESTADO_VENTA.ANULADO.getEstado()) {
            bkVentaFacturacion.setEstado(COLOR_ESTADO_VENTA.ANULADO.getValor());
            bkVentaFacturacion.setColor(COLOR_ESTADO_VENTA.ANULADO.getColor());
            bkVentaFacturacion.setEditable(true);
            bkVentaFacturacion.setAnulable(true);
        }
        if (bkVentaFacturacion.getVentaFacturacionFormulario().getEstado() == COLOR_ESTADO_VENTA.CREADA.getEstado()) {
            bkVentaFacturacion.setEstado(COLOR_ESTADO_VENTA.CREADA.getValor());
            bkVentaFacturacion.setColor(COLOR_ESTADO_VENTA.CREADA.getColor());
            bkVentaFacturacion.setEditable(false);
            bkVentaFacturacion.setAnulable(false);
        }
        if (bkVentaFacturacion.getVentaFacturacionFormulario().getEstado() == COLOR_ESTADO_VENTA.EMITIDO.getEstado()) {
            bkVentaFacturacion.setEstado(COLOR_ESTADO_VENTA.EMITIDO.getValor());
            bkVentaFacturacion.setColor(COLOR_ESTADO_VENTA.EMITIDO.getColor());
            bkVentaFacturacion.setEditable(true);
            bkVentaFacturacion.setAnulable(false);
        }
        if (bkVentaFacturacion.getVentaFacturacionFormulario().getEstado() == COLOR_ESTADO_VENTA.PAGADA.getEstado()) {
            bkVentaFacturacion.setEstado(COLOR_ESTADO_VENTA.PAGADA.getValor());
            bkVentaFacturacion.setColor(COLOR_ESTADO_VENTA.PAGADA.getColor());
            bkVentaFacturacion.setEditable(true);
            bkVentaFacturacion.setAnulable(true);
        }

        if (bkVentaFacturacion.getVentaFacturacionFormulario().getEstado() == COLOR_ESTADO_VENTA.PAGADA_PARCIAL.getEstado()) {
            bkVentaFacturacion.setEstado(COLOR_ESTADO_VENTA.PAGADA_PARCIAL.getValor());
            bkVentaFacturacion.setColor(COLOR_ESTADO_VENTA.PAGADA_PARCIAL.getColor());
            bkVentaFacturacion.setEditable(true);
            bkVentaFacturacion.setAnulable(false);
        }
    }

    public void buscarNumDoc() {
        for (CorrelativoDocumento correlativo : bkVentaFacturacion.getListaCorrelativos()) {
            if (correlativo.getSerie().equalsIgnoreCase(bkVentaFacturacion.getVentaFacturacionFormulario().getSerieFactura())) {
                bkVentaFacturacion.getVentaFacturacionFormulario().setNumFactura(correlativo.getNumero());
            }
        }
    }

    public void marcarInicio(DateSelectEvent event) {
        bkVentaFacturacion.setBusquedaDel(event.getDate());
    }

    public void marcarFinal(DateSelectEvent event) {
        bkVentaFacturacion.setBusquedaAl(event.getDate());
    }

    public void seleccionarGuia() {
        try {
            /*bkVentaFacturacion.getVentaFacturacionFormulario().setRuc(bkVentaFacturacion.getVentaFacturacionSeleccionado().getRuc());
             bkVentaFacturacion.getVentaFacturacionFormulario().setRazon(bkVentaFacturacion.getVentaFacturacionSeleccionado().getRazon());
             bkVentaFacturacion.getVentaFacturacionFormulario().setDireccion(bkVentaFacturacion.getVentaFacturacionSeleccionado().getDireccion());
             bkVentaFacturacion.getVentaFacturacionFormulario().setNOcliente(bkVentaFacturacion.getVentaFacturacionSeleccionado().getNOcliente());

             bkVentaFacturacion.getVentaFacturacionFormulario().setCodCliente(bkVentaFacturacion.getVentaFacturacionSeleccionado().getCodCliente());*/
            bkVentaFacturacion.getVentaFacturacionFormulario().setMoneda(bkVentaFacturacion.getVentaFacturacionSeleccionado().getMoneda());
            bkVentaFacturacion.getVentaFacturacionFormulario().setCoddocbase(bkVentaFacturacion.getVentaFacturacionSeleccionado().getCoddocventa());

            List<VentaDetalleFacturacion> lista = new ArrayList<VentaDetalleFacturacion>();
            lista = servicioVentaDetalleFacturacion.obtenerVentaDetalleFacturacion(bkVentaFacturacion.getVentaFacturacionSeleccionado().getCoddocventa());

            for (VentaDetalleFacturacion ventaDetalleFacturacion : lista) {
                System.out.println("articulo usado: " + ventaDetalleFacturacion.getCodarticulo().getNombreComercial());
                bkVentaDetalleFacturacion.getListaDetalleFacturacion().add(ventaDetalleFacturacion);
            }
            bkVentaFacturacion.getVentaFacturacionFormulario().setGuiaRem(bkVentaFacturacion.getVentaFacturacionFormulario().getGuiaRem() + " " + bkVentaFacturacion.getVentaFacturacionSeleccionado().getSerieFactura() + "-" + bkVentaFacturacion.getVentaFacturacionSeleccionado().getNumFactura());


            double total = 0.0;
            double subtotal = 0.0;
            double igv = 0.0;
            for (VentaDetalleFacturacion detallev : bkVentaDetalleFacturacion.getListaDetalleFacturacion()) {
                total = total + detallev.getTotal();
            }

//            igv = servicioIgv.ConseguirIgvVigente().getMonto().doubleValue() * total / 100; TODO CORREGIDO
//            subtotal = total - igv;

            /**/
            double valor_igv = servicioIgv.ConseguirIgvVigente().getMonto().doubleValue();
            subtotal = total * 100 / (100 + valor_igv);
            igv = subtotal * valor_igv / 100;
            /**/

            bkVentaFacturacion.getVentaFacturacionFormulario().setValorVenta(subtotal);
            bkVentaFacturacion.getVentaFacturacionFormulario().setIgv(igv);
            bkVentaFacturacion.getVentaFacturacionFormulario().setPrecioVenta(total);
            bkVentaFacturacion.getVentaFacturacionFormulario().setIgvPorcentaje(servicioIgv.ConseguirIgvVigente().getMonto().doubleValue());
            convertirALetra();


        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }

    }

    public void cargarArticulo() {
        //bkVentaFacturacion.setVentaFacturacionBusqueda(new VentaFacturacion());
        try {
            VentaFacturacion guiaBusqueda = new VentaFacturacion();
            guiaBusqueda.setTipoCompago(TIPO_DOC_VENTA.GUIA.getValor());
            guiaBusqueda.setRuc(bkVentaFacturacion.getVentaFacturacionFormulario().getRuc());
            guiaBusqueda.setRazon(bkVentaFacturacion.getVentaFacturacionFormulario().getRazon());
            guiaBusqueda.setSede(session.getSede());
            System.out.println("ruc: " + guiaBusqueda.getTipoCompago());
            System.out.println("razon: " + guiaBusqueda.getRuc());
            System.out.println("tipo comp: " + guiaBusqueda.getRazon());
            bkVentaFacturacion.setListaGuias(servicioVentaFacturacion.obtenerGuiasParaFactura(guiaBusqueda));

            System.out.println("lista de guias: " + bkVentaFacturacion.getListaGuias());
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public void buscarListaGuiasRemision() {
        try {
            bkVentaFacturacion.getVentaFacturacionBusqueda().setTipoCompago(TIPO_DOC_VENTA.GUIA.getValor());
            bkVentaFacturacion.setListaGuias(servicioVentaFacturacion.obtenerVentaFacturacionBusqueda(
                    bkVentaFacturacion.getVentaFacturacionBusqueda(), bkVentaFacturacion.getBusquedaDel(), bkVentaFacturacion.getBusquedaAl()));
            System.out.println(bkVentaFacturacion.getListaGuias().size());
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public void pagarFactura() {

        bkVentaFacturacion.getVentaFacturacionFormulario().setEstado(COLOR_ESTADO_VENTA.PAGADA.getEstado());
        bkVentaFacturacion.getVentaFacturacionFormulario().setPorCobrar(0.0);
        bkVentaFacturacion.getVentaFacturacionFormulario().setAcuenta(bkVentaFacturacion.getVentaFacturacionFormulario().getPrecioVenta());
        bkVentaFacturacion.getVentaFacturacionFormulario().setFecCancelacion(new Date());


        VentaLineaCredito lineaCredito = new VentaLineaCredito();
        try {
            lineaCredito = servicioVentaLineaCredito.getVentaLineaCredito(bkVentaFacturacion.getVentaFacturacionFormulario().getRuc());
            VentaLineaCreditoDetalle detalle = new VentaLineaCreditoDetalle();
            detalle.setDetalleCredito("Pago deuda");
            detalle.setMontoCredito(bkVentaFacturacion.getVentaFacturacionFormulario().getPorCobrar());
            detalle.setFechaOperacion(new Date());
            detalle.setLineaSaldo(lineaCredito.getLineaSaldo() + bkVentaFacturacion.getVentaFacturacionFormulario().getPorCobrar());
            detalle.setIdlinea(lineaCredito);
            servicioVentaLineaCreditoDetalle.guardarLineaCreditoDetalle(detalle);

            lineaCredito.setLineaSaldo(lineaCredito.getLineaSaldo() + bkVentaFacturacion.getVentaFacturacionFormulario().getPorCobrar());
            lineaCredito.setLineaUsada(lineaCredito.getLineaCredito() - lineaCredito.getLineaSaldo());

            servicioVentaFacturacion.actualizarVentaFacturacion(bkVentaFacturacion.getVentaFacturacionFormulario());
            servicioVentaLineaCredito.actualizarLineaCredito(lineaCredito);
        } catch (ServiceException ex) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(ex.getMessage(), ex);
        }
        actualizarEstado();

    }

    public boolean estaHabilitado(char estado) {
        if (estado != COLOR_ESTADO_VENTA.CREADA.getEstado()) {
            return true;
        } else {
            return false;
        }
    }

    /*public void marcarEmision(DateSelectEvent event) {
     bkVentaFacturacion.getVentaFacturacionFormulario().setF(event.getDate());
     }

     public void marcarVencimiento(DateSelectEvent event) {
     bkVentaFacturacion.setBusquedaAl(event.getDate());
     }*/
    public void elegirFormaPago() {
        if (bkVentaFacturacion.getIdTipoFormaPago() == TIPO_FORMA_PAGO.CREDITO.getValor()) {

            /*bkOrdenCompra.setListaTipoPago(new ArrayList<String>());
             for (ParametroDetalle param : servicioParametro.listarTipoPago(bkOrdenCompra.getOrdenCompraFormulario().getFormaPago().getNombre())) {
             bkOrdenCompra.getListaTipoPago().add(param.getValCadena());
             }
             bkOrdenCompra.getOrdenCompraFormulario().setDiasPago(null);*/

            bkVentaFacturacion.getVentaFacturacionFormulario().setFechVencimiento(bkVentaFacturacion.getVentaFacturacionFormulario().getFechDocventa());

        } else {
            bkVentaFacturacion.getVentaFacturacionFormulario().setFechVencimiento(null);
        }



    }

    public void cargarGuias() {
        //bk.setVentaFacturacionBusqueda(new VentaFacturacion());
        try {
            VentaFacturacion guiaBusqueda = new VentaFacturacion();
            guiaBusqueda.setTipoCompago(TIPO_DOC_VENTA.GUIA.getValor());
            guiaBusqueda.setRuc(bkVentaFacturacion.getVentaFacturacionFormulario().getRuc());
            guiaBusqueda.setRazon(bkVentaFacturacion.getVentaFacturacionFormulario().getRazon());
            guiaBusqueda.setSede(session.getSede());
            /*for (ParametroDetalle parametro : servicioParametro.listaTipoMotivoGuia()) {
             if (parametro.getValCadena().equalsIgnoreCase("EXPORTACION")) {
             guiaBusqueda.setMotTraslado(parametro.getId());
             }
             }*/
            System.out.println("");
            bkVentaFacturacion.setListaGuias(servicioVentaFacturacion.obtenerGuiasParaFactura(guiaBusqueda));

            System.out.println("lista de guias: " + bkVentaFacturacion.getListaGuias());
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }
}
